package ar.com.algotres.tpdos.model.mapas;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import ar.com.algotres.tpdos.model.aterrizable.Pista;
import ar.com.algotres.tpdos.model.aviones.Avion;
import ar.com.algotres.tpdos.model.fisica.AreaAterrizaje;
import ar.com.algotres.tpdos.model.fisica.Posicion;
import ar.com.algotres.tpdos.model.fisica.RepresentacionFisicaRectangular;
import ar.uba.fi.algo3.titiritero.Posicionable;

public class Mapa implements Posicionable {

	public static final Integer CERO = 0;
	public static final Integer DIMENSION_EN_X = 800;
	public static final Integer DIMENSION_EN_Y = 600;
	List<Pista> pistas;

	public Mapa(List<Pista> pistas) {
		this.pistas = pistas;
	}

	public List<Pista> getPistas() {
		return pistas;
	}

	/* Solo para poder usar el titiritero
	 * @see ar.uba.fi.algo3.titiritero.Posicionable#getX()
	 */
	@Override
	public int getX() {
		return 0;
	}

	/* Solo para poder usar el titiritero
	 * @see ar.uba.fi.algo3.titiritero.Posicionable#getY()
	 */
	@Override
	public int getY() {
		return 0;
	}
	
	public Posicion randomPosicion(){
		Random random = new Random();
		
		Integer x = random.nextInt(DIMENSION_EN_X);
		Integer y = random.nextInt(DIMENSION_EN_Y);
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPosicionEnLimites(){
		Random random = new Random();
		Integer x = 0;
		Integer y = 0;
			
		Integer unNumero = random.nextInt(DIMENSION_EN_Y-RepresentacionFisicaRectangular.ALTO);
		
		if (unNumero % 2 == 0){
			x = unNumero;
			if (unNumero % 3 == 0){
				y = DIMENSION_EN_Y-RepresentacionFisicaRectangular.ALTO;
			}
		} else {
			y = unNumero;
			if (unNumero % 3 == 0){
				x = DIMENSION_EN_X-RepresentacionFisicaRectangular.ANCHO;
			}
		}
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPosicionEnLimiteSuperior(){
		Random random = new Random();
		Integer x = random.nextInt(DIMENSION_EN_X-RepresentacionFisicaRectangular.ANCHO);
		Integer y = 0;
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPosicionEnLimiteInferior(){
		Random random = new Random();
		Integer x = random.nextInt(DIMENSION_EN_X-RepresentacionFisicaRectangular.ANCHO);
		Integer y = DIMENSION_EN_Y-RepresentacionFisicaRectangular.ALTO;
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPosicionEnLimiteIzquierdo(){
		Random random = new Random();
		Integer x = 0;
		Integer y = random.nextInt(DIMENSION_EN_Y-RepresentacionFisicaRectangular.ALTO);
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPosicionEnLimiteDerecho(){
		Random random = new Random();
		Integer x = DIMENSION_EN_X-RepresentacionFisicaRectangular.ANCHO;
		Integer y = random.nextInt(DIMENSION_EN_Y-RepresentacionFisicaRectangular.ALTO);
		
		return new Posicion(x.doubleValue(), y.doubleValue());
	}
	
	public Posicion randomPuntoDeAterrizaje(Avion avion){
		Random random = new Random();
		
		List<Pista> pistasSeleccionadas = new ArrayList<Pista>();
		for (Pista pista: pistas){
			if (avion.puedeAterrizarEnPista(pista)){
				pistasSeleccionadas.add(pista);
			}
		}
		
		Pista unaPista = (pistasSeleccionadas.size()-1) > 0 
				? pistasSeleccionadas.get(random.nextInt(pistasSeleccionadas.size()-1)) 
						: pistasSeleccionadas.get(0);
		AreaAterrizaje unAreaAterrizaje = (unaPista.getAreasAterrizaje().size()-1) > 0 
				? unaPista.getAreasAterrizaje().get(random.nextInt(unaPista.getAreasAterrizaje().size()-1)) 
						: unaPista.getAreasAterrizaje().get(0);
		
		return unAreaAterrizaje.getCentro();
	}

}
